In [ ]:
import pandas as pd
import numpy as np
from numpy.random import randn
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
import plotly.express as px
import plotly.io as pio
pio.renderers.default = "notebook"
import warnings
from sklearn.neighbors import KNeighborsRegressor, KNeighborsClassifier, LocalOutlierFactor
from sklearn.linear_model import LinearRegression, LogisticRegression, RidgeClassifier, SGDClassifier, PassiveAggressiveClassifier
from sklearn.tree import DecisionTreeClassifier, ExtraTreeClassifier
from sklearn.ensemble import IsolationForest, GradientBoostingClassifier, ExtraTreesClassifier, RandomForestClassifier, BaggingClassifier, AdaBoostClassifier
from xgboost import XGBClassifier
from sklearn.svm import OneClassSVM, SVC
from sklearn.naive_bayes import GaussianNB
from sklearn.preprocessing import RobustScaler, LabelEncoder
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.compose import ColumnTransformer
from sklearn.feature_selection import SelectKBest
from sklearn.feature_extraction import DictVectorizer
from sklearn.decomposition import PCA
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV, KFold, StratifiedKFold, train_test_split, cross_val_score
from sklearn.metrics import precision_score, recall_score, make_scorer, classification_report, accuracy_score, confusion_matrix, log_loss
from keras.models import Sequential
from keras.layers import Dense, Dropout
# Increases the size of sns plots
sns.set(rc={'figure.figsize':(5,5)})
sns.set_style('darkgrid')

Overview¶

In this excersie we are going to compare different methods of predicting type of breast cancer (B/M). We are particularly interested in comparing standard linear and nonliner classification algorithms with simple Artificial Neural Network architecture.

Dataset Information¶

Features are computed from a digitized image of a fine needle aspirate (FNA) of a breast mass. They describe characteristics of the cell nuclei present in the image.

Attribute Information:

  1. ID number
  2. Diagnosis (M = malignant, B = benign)

3-32)

Ten real-valued features are computed for each cell nucleus:

  • radius (mean of distances from center to points on the perimeter)
  • texture (standard deviation of gray-scale values)
  • perimeter
  • area
  • smoothness (local variation in radius lengths)
  • compactness (perimeter^2 / area - 1.0)
  • concavity (severity of concave portions of the contour)
  • concave points (number of concave portions of the contour)
  • symmetry
  • fractal dimension ("coastline approximation" - 1)

Source: https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Diagnostic%29

In [ ]:
# Reading dataframe
df = pd.read_csv("wdbc.data.csv", header=None)
df.head()
Out[ ]:
0 1 2 3 4 5 6 7 8 9 ... 22 23 24 25 26 27 28 29 30 31
0 842302 M 17.99 10.38 122.80 1001.0 0.11840 0.27760 0.3001 0.14710 ... 25.38 17.33 184.60 2019.0 0.1622 0.6656 0.7119 0.2654 0.4601 0.11890
1 842517 M 20.57 17.77 132.90 1326.0 0.08474 0.07864 0.0869 0.07017 ... 24.99 23.41 158.80 1956.0 0.1238 0.1866 0.2416 0.1860 0.2750 0.08902
2 84300903 M 19.69 21.25 130.00 1203.0 0.10960 0.15990 0.1974 0.12790 ... 23.57 25.53 152.50 1709.0 0.1444 0.4245 0.4504 0.2430 0.3613 0.08758
3 84348301 M 11.42 20.38 77.58 386.1 0.14250 0.28390 0.2414 0.10520 ... 14.91 26.50 98.87 567.7 0.2098 0.8663 0.6869 0.2575 0.6638 0.17300
4 84358402 M 20.29 14.34 135.10 1297.0 0.10030 0.13280 0.1980 0.10430 ... 22.54 16.67 152.20 1575.0 0.1374 0.2050 0.4000 0.1625 0.2364 0.07678

5 rows × 32 columns

In [ ]:
#Inputs from output and splitting into training/test set
X = df.iloc[:, 2:].to_numpy()
y = df.iloc[:, 1].to_numpy()
y = LabelEncoder().fit_transform(y)
X_train, X_test, y_train, y_test = train_test_split(X, y, shuffle=True, random_state=111, test_size=0.1)

Basic EDA¶

In [ ]:
# Check for missing values
import missingno as msno
from missingno import bar
msno.bar(df)
Out[ ]:
<AxesSubplot: >

Data is 100% complete.

In [ ]:
# Distribution of variables
df2 = pd.DataFrame(X)
for i in df2.columns[2:5]:
    fig = px.histogram(df2, 
                   x=i, 
                   marginal='box', 
                   text_auto=True,
                   color_discrete_sequence  = ['steelblue'],
                   template='simple_white')

    fig.update_layout(xaxis_title=i, yaxis_title="Count", bargap=0.1)
    fig.show()

Looking above at 3 random variables, we can see multiple outliers presence.

In [ ]:
# Dependent variable weights
df[1].value_counts()
Out[ ]:
B    357
M    212
Name: 1, dtype: int64

Standard classification methods¶

In this section we are defining several functions for batch-evaluating different models.

In [ ]:
from numpy import mean
from numpy import std

#dictionary of models to be evaluated
def define_models(models=dict()):
	#linear models
	models['logistic'] = LogisticRegression(max_iter=1000)
	alpha = [0.1, 0.2, 0.3]
	for a in alpha:
		models['ridge-'+str(a)] = RidgeClassifier(alpha=a)
	models['sgd'] = SGDClassifier(max_iter=1000, tol=1e-3)
	models['pa'] = PassiveAggressiveClassifier(max_iter=1000, tol=1e-3)
	#nonlinear models
	n_neighbors = range(3, 10)
	for k in n_neighbors:
		models['knn-'+str(k)] = KNeighborsClassifier(n_neighbors=k)
	models['cart'] = DecisionTreeClassifier()
	models['extra'] = ExtraTreeClassifier()
	models['svml'] = SVC(kernel='linear')
	models['svmp'] = SVC(kernel='poly')
	c_values = [0.1, 0.2, 0.3]
	for c in c_values:
		models['svmr'+str(c)] = SVC(C=c)
	models['bayes'] = GaussianNB()
	#ensemble models
	n_trees = 100
	models['ada'] = AdaBoostClassifier(n_estimators=n_trees)
	models['bag'] = BaggingClassifier(n_estimators=n_trees)
	models['rf'] = RandomForestClassifier(n_estimators=n_trees)
	models['et'] = ExtraTreesClassifier(n_estimators=n_trees)
	models['gbm'] = GradientBoostingClassifier(n_estimators=n_trees)
	print('Defined %d models' % len(models))
	return models

# additionally define and append gradient boosting models to the previously created list of models
def define_gbm_models(models=dict(), use_xgb=True):
	#define grid space
	rates = [0.001, 0.01, 0.1]
	trees = [100, 500]
	depth = [3, 7, 9]
	#adding consecutive configurations
	for l in rates:
		for t in trees:
			for d in depth:
				cfg = [l, t, d]
				if use_xgb:
					name = 'xgb-' + str(cfg)
					models[name] = XGBClassifier(learning_rate=l, n_estimators=t, max_depth=d)
				else:
					name = 'gbm-' + str(cfg)
					models[name] = GradientBoostingClassifier(learning_rate=l, n_estimators=t, max_depth=d)
	print('Defined %d models' % len(models))
	return models

#evaluate a single model
def evaluate_model(X, y, model, folds, metric):
	skf = StratifiedKFold(n_splits=folds, shuffle = True, random_state = 1001)
	# create the pipeline
	pipeline = make_pipeline(model)
	#evaluate model
	scores = cross_val_score(pipeline, X, y, scoring=metric, cv=skf, verbose=5)
	return scores
 
#evaluate a single model and filter out errors
def hidden_evaluate_mode(X, y, model, folds, metric):
	scores = None
	try:
		with warnings.catch_warnings():
			warnings.filterwarnings("ignore")
			scores = evaluate_model(X, y, model, folds, metric)
	except:
		scores = None
	return scores
 
# evaluate a dict of models {name:object}, returns {name:score}
def evaluate_models(X, y, models, folds=3, metric='accuracy'):
	results = dict()
	for name, model in models.items():
		# evaluate the model
		scores = hidden_evaluate_mode(X, y, model, folds, metric)
		# show process
		if scores is not None:
			# store a result
			results[name] = scores
			mean_score, std_score = mean(scores), std(scores)
			print('>%s: %.3f (+/-%.3f)' % (name, mean_score, std_score))
		else:
			print('>%s: error' % name)
	return results
 
#print and plot top results
def summarize_results(results, maximize=True, top_n=10):
	#check for empty result
	if len(results) == 0:
		print('no results')
		return
	#determine how many results to summarize
	n = min(top_n, len(results))
	#create a list of (name, mean(scores)) tuples
	mean_scores = [(k, mean(v)) for k,v in results.items()]
	#sort tuples by mean score
	mean_scores = sorted(mean_scores, key=lambda x: x[1])
	#reverse for descending order (e.g. for accuracy)
	if maximize:
		mean_scores = list(reversed(mean_scores))
	#retrieve the top n for summary
	names = [x[0] for x in mean_scores[:n]]
	scores = [results[x[0]] for x in mean_scores[:n]]
	# print the top n
	print()
	for i in range(n):
		name = names[i]
		mean_score, std_score = mean(results[name]), std(results[name])
		print('Rank=%d, Name=%s, Score=%.3f (+/- %.3f)' % (i+1, name, mean_score, std_score))
	#boxplot for the top values
	plt.boxplot(scores, labels=names)
	_, labels = plt.xticks()
	plt.setp(labels, rotation=90)

#get model list
models = define_models()
models = define_gbm_models(models)
Defined 26 models
Defined 44 models

We are also defining pipeline to scale the variables with RobustScaler() due to presence of outliers and perform Principal Compoent Analysis to reduce feature space as we are dealing with variables based on physical properties of cells (radius, area), which might be higly correlated.

In [ ]:
#DEFINING PIPELINE
def make_pipeline(model):
    numeric_transformer = Pipeline(steps=[
        # ('imputer', SimpleImputer(strategy='mean')),
        ('standard_scaler', RobustScaler()),
        ('pca', PCA())#n_components=0.9, svd_solver='full'))
    ])
    preprocessor = ColumnTransformer(
    transformers=[
        ('numeric', numeric_transformer, slice(2,32)),
        # ('categorical', categorical_transformer, categorical_features)
    ]) 

    pipeline = Pipeline(steps = [
                ('preprocessor', preprocessor),
                ('model', model)
            ])
    return pipeline
# Call function once to show a sample pipeline
make_pipeline(model = models['logistic'])
Out[ ]:
Pipeline(steps=[('preprocessor',
                 ColumnTransformer(transformers=[('numeric',
                                                  Pipeline(steps=[('standard_scaler',
                                                                   RobustScaler()),
                                                                  ('pca',
                                                                   PCA())]),
                                                  slice(2, 32, None))])),
                ('model', LogisticRegression(max_iter=1000))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
Pipeline(steps=[('preprocessor',
                 ColumnTransformer(transformers=[('numeric',
                                                  Pipeline(steps=[('standard_scaler',
                                                                   RobustScaler()),
                                                                  ('pca',
                                                                   PCA())]),
                                                  slice(2, 32, None))])),
                ('model', LogisticRegression(max_iter=1000))])
ColumnTransformer(transformers=[('numeric',
                                 Pipeline(steps=[('standard_scaler',
                                                  RobustScaler()),
                                                 ('pca', PCA())]),
                                 slice(2, 32, None))])
slice(2, 32, None)
RobustScaler()
PCA()
LogisticRegression(max_iter=1000)

Now we evaluate pre-prepared dictionary of models with 3-fold cross validation on the training set.

In [ ]:
import time
# Start timer for assessing batch-testing of multiple models
start = time.time()
# call function for batch-evaluating dictionary of models of training split
results_2 = evaluate_models(X_train, y_train, models)
end = time.time()
In [ ]:
print("Execution time: ",(end-start), "s")
Execution time:  120.1248710155487 s
In [ ]:
#Results of batch-searching through multiple models
summarize_results(results_2, top_n=20)
Rank=1, Name=svml, Score=0.975 (+/- 0.003)
Rank=2, Name=logistic, Score=0.973 (+/- 0.007)
Rank=3, Name=pa, Score=0.969 (+/- 0.011)
Rank=4, Name=sgd, Score=0.969 (+/- 0.003)
Rank=5, Name=knn-9, Score=0.955 (+/- 0.023)
Rank=6, Name=ridge-0.3, Score=0.949 (+/- 0.022)
Rank=7, Name=ridge-0.2, Score=0.949 (+/- 0.022)
Rank=8, Name=ridge-0.1, Score=0.949 (+/- 0.022)
Rank=9, Name=knn-7, Score=0.949 (+/- 0.018)
Rank=10, Name=xgb-[0.1, 500, 9], Score=0.947 (+/- 0.019)
Rank=11, Name=xgb-[0.1, 500, 7], Score=0.947 (+/- 0.019)
Rank=12, Name=knn-8, Score=0.947 (+/- 0.030)
Rank=13, Name=knn-6, Score=0.947 (+/- 0.022)
Rank=14, Name=svmr0.3, Score=0.945 (+/- 0.028)
Rank=15, Name=knn-3, Score=0.945 (+/- 0.014)
Rank=16, Name=xgb-[0.1, 500, 3], Score=0.943 (+/- 0.011)
Rank=17, Name=knn-5, Score=0.943 (+/- 0.017)
Rank=18, Name=xgb-[0.1, 100, 9], Score=0.941 (+/- 0.027)
Rank=19, Name=xgb-[0.1, 100, 7], Score=0.941 (+/- 0.027)
Rank=20, Name=xgb-[0.1, 100, 3], Score=0.941 (+/- 0.019)
In [ ]:
# Define model and pipeline
model_svcl = SVC()
pipe_svcl = make_pipeline(model_svcl)

# Define search grid
grid = GridSearchCV(
    estimator=pipe_svcl,
    param_grid={'model__degree': [_ for _ in np.linspace(1, 5, 5)],
                'model__kernel': [_ for _ in ['linear', 'poly', 'rbf']]},
    scoring={'precision': make_scorer(precision_score), 
             'recall': make_scorer(recall_score),
             'accuracy': make_scorer(accuracy_score)},
    refit='accuracy',
    return_train_score=False,
    cv=10,
    n_jobs=1
)
# Fit the model
grid.fit(X_train, y_train);
In [ ]:
df_results = pd.DataFrame(grid.cv_results_)
df_1 = df_results[df_results['param_model__kernel'] == 'poly']
df_1
Out[ ]:
mean_fit_time std_fit_time mean_score_time std_score_time param_model__degree param_model__kernel params split0_test_precision split1_test_precision split2_test_precision ... split3_test_accuracy split4_test_accuracy split5_test_accuracy split6_test_accuracy split7_test_accuracy split8_test_accuracy split9_test_accuracy mean_test_accuracy std_test_accuracy rank_test_accuracy
1 0.139108 0.058178 0.009301 0.001345 1.0 poly {'model__degree': 1.0, 'model__kernel': 'poly'} 0.95 1.0 0.947368 ... 1.000000 0.960784 0.941176 0.980392 0.941176 1.000000 0.960784 0.970664 0.021890 6
4 0.100606 0.054840 0.012901 0.009985 2.0 poly {'model__degree': 2.0, 'model__kernel': 'poly'} 1.00 1.0 1.000000 ... 0.843137 0.803922 0.784314 0.823529 0.784314 0.862745 0.764706 0.810558 0.028985 14
7 0.072704 0.036425 0.008700 0.001900 3.0 poly {'model__degree': 3.0, 'model__kernel': 'poly'} 1.00 1.0 1.000000 ... 0.882353 0.882353 0.882353 0.980392 0.843137 0.921569 0.803922 0.882805 0.047106 12
10 0.173710 0.125013 0.011501 0.002500 4.0 poly {'model__degree': 4.0, 'model__kernel': 'poly'} 1.00 1.0 1.000000 ... 0.764706 0.803922 0.784314 0.823529 0.745098 0.823529 0.725490 0.783220 0.033075 15
13 0.070704 0.027628 0.010901 0.002071 5.0 poly {'model__degree': 5.0, 'model__kernel': 'poly'} 1.00 1.0 1.000000 ... 0.784314 0.823529 0.843137 0.882353 0.803922 0.843137 0.784314 0.822247 0.029699 13

5 rows × 46 columns

In [ ]:
df_mean = df_results.groupby('param_model__kernel').agg('mean')
df_mean.mean_test_accuracy
Out[ ]:
param_model__kernel
linear    0.968741
poly      0.853899
rbf       0.970701
Name: mean_test_accuracy, dtype: float64
In [ ]:
# Plot grid-search results
plt.figure(figsize=(12, 4))
for kernel in df_results.param_model__kernel.unique():
    plt.plot(df_results[df_results['param_model__kernel'] == kernel].param_model__degree,
            df_results[df_results['param_model__kernel'] == kernel].mean_test_accuracy,
            label = kernel)
plt.legend();

Both 1-degree polynomial model and rbf give similar values of accuracy. We choose Supported Vector Machine with rbf kernel as a final nonlinear model.

In [ ]:
# Fitting final model and plotting confusion matrix
model_svc_final = SVC(kernel='rbf')
pipe_svc_final = make_pipeline(model_svcl)
pipe_svc_final.fit(X_train, y_train)
y_pred = pipe_svc_final.predict(X_test)
y_pred = (y_pred > 0.50)
cm = confusion_matrix(y_test, y_pred)
cat = ['Benign - 0', 'Malignant - 1']
sns.heatmap(cm, annot = True, xticklabels = cat, yticklabels = cat)
Out[ ]:
<AxesSubplot: >

In case of SVC model only 1 case is classified incorrectly on the test set.

Artificial Neural Network¶

This time simple architecture of neural network is defined using keras package.

In [ ]:
from keras import backend as K
del model_deep
K.clear_session()

model_deep = Sequential(
    [
        Dense(units=32, activation='relu', kernel_initializer="uniform" ,input_shape=(30,)),
        Dropout(rate=0.1),
        Dense(units=32, activation='relu', kernel_initializer="uniform"),
        Dropout(rate=0.1),
        Dense(units=1, activation='sigmoid'),
    ]
)
model_deep.layers
model_deep.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model_deep.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 32)                992       
                                                                 
 dropout (Dropout)           (None, 32)                0         
                                                                 
 dense_1 (Dense)             (None, 32)                1056      
                                                                 
 dropout_1 (Dropout)         (None, 32)                0         
                                                                 
 dense_2 (Dense)             (None, 1)                 33        
                                                                 
=================================================================
Total params: 2,081
Trainable params: 2,081
Non-trainable params: 0
_________________________________________________________________
In [ ]:
# Fitting the ANN model
start_n = time.time()
model_deep.fit(X_train, y_train, batch_size=100, epochs=400)
end_n = time.time()
Epoch 1/400
6/6 [==============================] - 2s 4ms/step - loss: 1.1306 - accuracy: 0.4453
Epoch 2/400
6/6 [==============================] - 0s 8ms/step - loss: 0.7455 - accuracy: 0.5898
Epoch 3/400
6/6 [==============================] - 0s 18ms/step - loss: 0.7273 - accuracy: 0.6543
Epoch 4/400
6/6 [==============================] - 0s 8ms/step - loss: 0.6203 - accuracy: 0.5566
Epoch 5/400
6/6 [==============================] - 0s 8ms/step - loss: 0.5975 - accuracy: 0.7617
Epoch 6/400
6/6 [==============================] - 0s 7ms/step - loss: 0.5526 - accuracy: 0.7832
Epoch 7/400
6/6 [==============================] - 0s 7ms/step - loss: 0.5231 - accuracy: 0.7695
Epoch 8/400
6/6 [==============================] - 0s 8ms/step - loss: 0.4916 - accuracy: 0.8086
Epoch 9/400
6/6 [==============================] - 0s 5ms/step - loss: 0.4288 - accuracy: 0.8613
Epoch 10/400
6/6 [==============================] - 0s 5ms/step - loss: 0.4108 - accuracy: 0.8457
Epoch 11/400
6/6 [==============================] - 0s 6ms/step - loss: 0.3662 - accuracy: 0.8691
Epoch 12/400
6/6 [==============================] - 0s 5ms/step - loss: 0.3462 - accuracy: 0.8730
Epoch 13/400
6/6 [==============================] - 0s 14ms/step - loss: 0.3140 - accuracy: 0.8887
Epoch 14/400
6/6 [==============================] - 0s 6ms/step - loss: 0.3429 - accuracy: 0.8672
Epoch 15/400
6/6 [==============================] - 0s 4ms/step - loss: 0.3033 - accuracy: 0.8848
Epoch 16/400
6/6 [==============================] - 0s 5ms/step - loss: 0.3027 - accuracy: 0.9023
Epoch 17/400
6/6 [==============================] - 0s 14ms/step - loss: 0.2762 - accuracy: 0.8926
Epoch 18/400
6/6 [==============================] - 0s 4ms/step - loss: 0.2912 - accuracy: 0.8906
Epoch 19/400
6/6 [==============================] - 0s 23ms/step - loss: 0.2574 - accuracy: 0.9023
Epoch 20/400
6/6 [==============================] - 0s 12ms/step - loss: 0.2685 - accuracy: 0.8984
Epoch 21/400
6/6 [==============================] - 0s 10ms/step - loss: 0.2660 - accuracy: 0.9082
Epoch 22/400
6/6 [==============================] - 0s 7ms/step - loss: 0.2847 - accuracy: 0.8906
Epoch 23/400
6/6 [==============================] - 0s 9ms/step - loss: 0.2709 - accuracy: 0.9004
Epoch 24/400
6/6 [==============================] - 0s 5ms/step - loss: 0.2317 - accuracy: 0.9141
Epoch 25/400
6/6 [==============================] - 0s 12ms/step - loss: 0.2461 - accuracy: 0.9121
Epoch 26/400
6/6 [==============================] - 0s 5ms/step - loss: 0.2330 - accuracy: 0.9121
Epoch 27/400
6/6 [==============================] - 0s 5ms/step - loss: 0.2258 - accuracy: 0.9004
Epoch 28/400
6/6 [==============================] - 0s 5ms/step - loss: 0.2262 - accuracy: 0.9082
Epoch 29/400
6/6 [==============================] - 0s 5ms/step - loss: 0.2526 - accuracy: 0.9062
Epoch 30/400
6/6 [==============================] - 0s 4ms/step - loss: 0.3385 - accuracy: 0.8516
Epoch 31/400
6/6 [==============================] - 0s 4ms/step - loss: 0.2400 - accuracy: 0.9121
Epoch 32/400
6/6 [==============================] - 0s 5ms/step - loss: 0.2268 - accuracy: 0.9160
Epoch 33/400
6/6 [==============================] - 0s 4ms/step - loss: 0.2360 - accuracy: 0.9121
Epoch 34/400
6/6 [==============================] - 0s 32ms/step - loss: 0.2282 - accuracy: 0.9062
Epoch 35/400
6/6 [==============================] - 0s 5ms/step - loss: 0.2187 - accuracy: 0.9160
Epoch 36/400
6/6 [==============================] - 0s 13ms/step - loss: 0.2519 - accuracy: 0.8984
Epoch 37/400
6/6 [==============================] - 0s 12ms/step - loss: 0.2428 - accuracy: 0.9141
Epoch 38/400
6/6 [==============================] - 0s 5ms/step - loss: 0.2601 - accuracy: 0.8926
Epoch 39/400
6/6 [==============================] - 0s 13ms/step - loss: 0.2295 - accuracy: 0.9160
Epoch 40/400
6/6 [==============================] - 0s 8ms/step - loss: 0.2151 - accuracy: 0.9258
Epoch 41/400
6/6 [==============================] - 0s 21ms/step - loss: 0.2250 - accuracy: 0.9102
Epoch 42/400
6/6 [==============================] - 0s 5ms/step - loss: 0.2111 - accuracy: 0.9238
Epoch 43/400
6/6 [==============================] - 0s 5ms/step - loss: 0.2118 - accuracy: 0.9141
Epoch 44/400
6/6 [==============================] - 0s 18ms/step - loss: 0.2246 - accuracy: 0.9062
Epoch 45/400
6/6 [==============================] - 0s 12ms/step - loss: 0.2251 - accuracy: 0.9160
Epoch 46/400
6/6 [==============================] - 0s 10ms/step - loss: 0.2192 - accuracy: 0.9160
Epoch 47/400
6/6 [==============================] - 0s 5ms/step - loss: 0.2013 - accuracy: 0.9199
Epoch 48/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1973 - accuracy: 0.9160
Epoch 49/400
6/6 [==============================] - 0s 22ms/step - loss: 0.2100 - accuracy: 0.9121
Epoch 50/400
6/6 [==============================] - 0s 12ms/step - loss: 0.2270 - accuracy: 0.9141
Epoch 51/400
6/6 [==============================] - 0s 6ms/step - loss: 0.2090 - accuracy: 0.8984
Epoch 52/400
6/6 [==============================] - 0s 15ms/step - loss: 0.2069 - accuracy: 0.9160
Epoch 53/400
6/6 [==============================] - 0s 27ms/step - loss: 0.1930 - accuracy: 0.9277
Epoch 54/400
6/6 [==============================] - 0s 15ms/step - loss: 0.2043 - accuracy: 0.9141
Epoch 55/400
6/6 [==============================] - 0s 17ms/step - loss: 0.1902 - accuracy: 0.9219
Epoch 56/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1947 - accuracy: 0.9277
Epoch 57/400
6/6 [==============================] - 0s 10ms/step - loss: 0.1813 - accuracy: 0.9277
Epoch 58/400
6/6 [==============================] - 0s 12ms/step - loss: 0.1961 - accuracy: 0.9277
Epoch 59/400
6/6 [==============================] - 0s 4ms/step - loss: 0.2082 - accuracy: 0.9160
Epoch 60/400
6/6 [==============================] - 0s 11ms/step - loss: 0.1932 - accuracy: 0.9258
Epoch 61/400
6/6 [==============================] - 0s 23ms/step - loss: 0.1931 - accuracy: 0.9277
Epoch 62/400
6/6 [==============================] - 0s 11ms/step - loss: 0.2063 - accuracy: 0.9102
Epoch 63/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1933 - accuracy: 0.9238
Epoch 64/400
6/6 [==============================] - 0s 22ms/step - loss: 0.1855 - accuracy: 0.9199
Epoch 65/400
6/6 [==============================] - 0s 10ms/step - loss: 0.1824 - accuracy: 0.9238
Epoch 66/400
6/6 [==============================] - 0s 5ms/step - loss: 0.2146 - accuracy: 0.9141
Epoch 67/400
6/6 [==============================] - 0s 14ms/step - loss: 0.1916 - accuracy: 0.9199
Epoch 68/400
6/6 [==============================] - 0s 14ms/step - loss: 0.2218 - accuracy: 0.9082
Epoch 69/400
6/6 [==============================] - 0s 9ms/step - loss: 0.2057 - accuracy: 0.9121
Epoch 70/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1907 - accuracy: 0.9199
Epoch 71/400
6/6 [==============================] - 0s 5ms/step - loss: 0.2101 - accuracy: 0.9180
Epoch 72/400
6/6 [==============================] - 0s 9ms/step - loss: 0.1795 - accuracy: 0.9258
Epoch 73/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1707 - accuracy: 0.9277
Epoch 74/400
6/6 [==============================] - 0s 12ms/step - loss: 0.1826 - accuracy: 0.9199
Epoch 75/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1818 - accuracy: 0.9238
Epoch 76/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1984 - accuracy: 0.9180
Epoch 77/400
6/6 [==============================] - 0s 10ms/step - loss: 0.1752 - accuracy: 0.9316
Epoch 78/400
6/6 [==============================] - 0s 12ms/step - loss: 0.2582 - accuracy: 0.8828
Epoch 79/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1774 - accuracy: 0.9375
Epoch 80/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1883 - accuracy: 0.9277
Epoch 81/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1922 - accuracy: 0.9219
Epoch 82/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1756 - accuracy: 0.9258
Epoch 83/400
6/6 [==============================] - 0s 19ms/step - loss: 0.1886 - accuracy: 0.9316
Epoch 84/400
6/6 [==============================] - 0s 14ms/step - loss: 0.1859 - accuracy: 0.9219
Epoch 85/400
6/6 [==============================] - 0s 12ms/step - loss: 0.1932 - accuracy: 0.9180
Epoch 86/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1797 - accuracy: 0.9297
Epoch 87/400
6/6 [==============================] - 0s 13ms/step - loss: 0.1760 - accuracy: 0.9336
Epoch 88/400
6/6 [==============================] - 0s 17ms/step - loss: 0.1737 - accuracy: 0.9219
Epoch 89/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1767 - accuracy: 0.9219
Epoch 90/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1898 - accuracy: 0.9297
Epoch 91/400
6/6 [==============================] - 0s 10ms/step - loss: 0.1787 - accuracy: 0.9180
Epoch 92/400
6/6 [==============================] - 0s 10ms/step - loss: 0.1751 - accuracy: 0.9355
Epoch 93/400
6/6 [==============================] - 0s 10ms/step - loss: 0.2574 - accuracy: 0.8926
Epoch 94/400
6/6 [==============================] - 0s 10ms/step - loss: 0.2440 - accuracy: 0.8965
Epoch 95/400
6/6 [==============================] - 0s 15ms/step - loss: 0.1920 - accuracy: 0.9238
Epoch 96/400
6/6 [==============================] - 0s 17ms/step - loss: 0.1944 - accuracy: 0.9238
Epoch 97/400
6/6 [==============================] - 0s 17ms/step - loss: 0.1938 - accuracy: 0.9141
Epoch 98/400
6/6 [==============================] - 0s 13ms/step - loss: 0.1760 - accuracy: 0.9336
Epoch 99/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1805 - accuracy: 0.9238
Epoch 100/400
6/6 [==============================] - 0s 4ms/step - loss: 0.1635 - accuracy: 0.9434
Epoch 101/400
6/6 [==============================] - 0s 4ms/step - loss: 0.1869 - accuracy: 0.9258
Epoch 102/400
6/6 [==============================] - 0s 10ms/step - loss: 0.1773 - accuracy: 0.9219
Epoch 103/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1692 - accuracy: 0.9355
Epoch 104/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1864 - accuracy: 0.9180
Epoch 105/400
6/6 [==============================] - 0s 16ms/step - loss: 0.1678 - accuracy: 0.9375
Epoch 106/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1813 - accuracy: 0.9180
Epoch 107/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1726 - accuracy: 0.9121
Epoch 108/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1705 - accuracy: 0.9355
Epoch 109/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1623 - accuracy: 0.9297
Epoch 110/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1904 - accuracy: 0.9258
Epoch 111/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1575 - accuracy: 0.9395
Epoch 112/400
6/6 [==============================] - 0s 31ms/step - loss: 0.2428 - accuracy: 0.8789
Epoch 113/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1967 - accuracy: 0.9238
Epoch 114/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1628 - accuracy: 0.9316
Epoch 115/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1617 - accuracy: 0.9316
Epoch 116/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1590 - accuracy: 0.9414
Epoch 117/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1574 - accuracy: 0.9355
Epoch 118/400
6/6 [==============================] - 0s 40ms/step - loss: 0.1504 - accuracy: 0.9316
Epoch 119/400
6/6 [==============================] - 0s 14ms/step - loss: 0.1648 - accuracy: 0.9395
Epoch 120/400
6/6 [==============================] - 0s 20ms/step - loss: 0.1853 - accuracy: 0.9160
Epoch 121/400
6/6 [==============================] - 0s 19ms/step - loss: 0.1690 - accuracy: 0.9375
Epoch 122/400
6/6 [==============================] - 0s 9ms/step - loss: 0.1569 - accuracy: 0.9395
Epoch 123/400
6/6 [==============================] - 0s 9ms/step - loss: 0.1621 - accuracy: 0.9336
Epoch 124/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1865 - accuracy: 0.9336
Epoch 125/400
6/6 [==============================] - 0s 33ms/step - loss: 0.1697 - accuracy: 0.9258
Epoch 126/400
6/6 [==============================] - 0s 16ms/step - loss: 0.1668 - accuracy: 0.9355
Epoch 127/400
6/6 [==============================] - 0s 16ms/step - loss: 0.1676 - accuracy: 0.9316
Epoch 128/400
6/6 [==============================] - 0s 4ms/step - loss: 0.1649 - accuracy: 0.9219
Epoch 129/400
6/6 [==============================] - 0s 9ms/step - loss: 0.1490 - accuracy: 0.9375
Epoch 130/400
6/6 [==============================] - 0s 13ms/step - loss: 0.1578 - accuracy: 0.9277
Epoch 131/400
6/6 [==============================] - 0s 15ms/step - loss: 0.1525 - accuracy: 0.9414
Epoch 132/400
6/6 [==============================] - 0s 12ms/step - loss: 0.1979 - accuracy: 0.9121
Epoch 133/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1665 - accuracy: 0.9375
Epoch 134/400
6/6 [==============================] - 0s 9ms/step - loss: 0.1575 - accuracy: 0.9336
Epoch 135/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1506 - accuracy: 0.9355
Epoch 136/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1519 - accuracy: 0.9297
Epoch 137/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1453 - accuracy: 0.9395
Epoch 138/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1427 - accuracy: 0.9453
Epoch 139/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1397 - accuracy: 0.9453
Epoch 140/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1529 - accuracy: 0.9355
Epoch 141/400
6/6 [==============================] - 0s 13ms/step - loss: 0.1498 - accuracy: 0.9434
Epoch 142/400
6/6 [==============================] - 0s 9ms/step - loss: 0.1399 - accuracy: 0.9453
Epoch 143/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1462 - accuracy: 0.9434
Epoch 144/400
6/6 [==============================] - 0s 13ms/step - loss: 0.1556 - accuracy: 0.9492
Epoch 145/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1406 - accuracy: 0.9414
Epoch 146/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1487 - accuracy: 0.9473
Epoch 147/400
6/6 [==============================] - 0s 9ms/step - loss: 0.2227 - accuracy: 0.9023
Epoch 148/400
6/6 [==============================] - 0s 12ms/step - loss: 0.1741 - accuracy: 0.9316
Epoch 149/400
6/6 [==============================] - 0s 13ms/step - loss: 0.1484 - accuracy: 0.9375
Epoch 150/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1535 - accuracy: 0.9414
Epoch 151/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1502 - accuracy: 0.9355
Epoch 152/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1691 - accuracy: 0.9297
Epoch 153/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1441 - accuracy: 0.9414
Epoch 154/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1539 - accuracy: 0.9395
Epoch 155/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1500 - accuracy: 0.9395
Epoch 156/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1653 - accuracy: 0.9316
Epoch 157/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1367 - accuracy: 0.9434
Epoch 158/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1468 - accuracy: 0.9512
Epoch 159/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1290 - accuracy: 0.9512
Epoch 160/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1250 - accuracy: 0.9473
Epoch 161/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1254 - accuracy: 0.9531
Epoch 162/400
6/6 [==============================] - 0s 15ms/step - loss: 0.1473 - accuracy: 0.9375
Epoch 163/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1628 - accuracy: 0.9414
Epoch 164/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1510 - accuracy: 0.9316
Epoch 165/400
6/6 [==============================] - 0s 9ms/step - loss: 0.1522 - accuracy: 0.9414
Epoch 166/400
6/6 [==============================] - 0s 15ms/step - loss: 0.1386 - accuracy: 0.9473
Epoch 167/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1424 - accuracy: 0.9434
Epoch 168/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1273 - accuracy: 0.9473
Epoch 169/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1519 - accuracy: 0.9434
Epoch 170/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1591 - accuracy: 0.9414
Epoch 171/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1688 - accuracy: 0.9180
Epoch 172/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1571 - accuracy: 0.9355
Epoch 173/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1664 - accuracy: 0.9258
Epoch 174/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1457 - accuracy: 0.9355
Epoch 175/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1523 - accuracy: 0.9395
Epoch 176/400
6/6 [==============================] - 0s 6ms/step - loss: 0.2618 - accuracy: 0.8828
Epoch 177/400
6/6 [==============================] - 0s 4ms/step - loss: 0.2113 - accuracy: 0.9102
Epoch 178/400
6/6 [==============================] - 0s 6ms/step - loss: 0.2085 - accuracy: 0.9180
Epoch 179/400
6/6 [==============================] - 0s 4ms/step - loss: 0.1616 - accuracy: 0.9355
Epoch 180/400
6/6 [==============================] - 0s 9ms/step - loss: 0.1747 - accuracy: 0.9375
Epoch 181/400
6/6 [==============================] - 0s 16ms/step - loss: 0.1464 - accuracy: 0.9395
Epoch 182/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1693 - accuracy: 0.9258
Epoch 183/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1369 - accuracy: 0.9453
Epoch 184/400
6/6 [==============================] - 0s 35ms/step - loss: 0.1485 - accuracy: 0.9453
Epoch 185/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1855 - accuracy: 0.9199
Epoch 186/400
6/6 [==============================] - 0s 30ms/step - loss: 0.2046 - accuracy: 0.9219
Epoch 187/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1909 - accuracy: 0.9102
Epoch 188/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1991 - accuracy: 0.9258
Epoch 189/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1724 - accuracy: 0.9199
Epoch 190/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1883 - accuracy: 0.9277
Epoch 191/400
6/6 [==============================] - 0s 15ms/step - loss: 0.1532 - accuracy: 0.9277
Epoch 192/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1668 - accuracy: 0.9336
Epoch 193/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1505 - accuracy: 0.9297
Epoch 194/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1516 - accuracy: 0.9375
Epoch 195/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1639 - accuracy: 0.9258
Epoch 196/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1699 - accuracy: 0.9316
Epoch 197/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1532 - accuracy: 0.9355
Epoch 198/400
6/6 [==============================] - 0s 9ms/step - loss: 0.1480 - accuracy: 0.9297
Epoch 199/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1311 - accuracy: 0.9434
Epoch 200/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1529 - accuracy: 0.9395
Epoch 201/400
6/6 [==============================] - 0s 5ms/step - loss: 0.2210 - accuracy: 0.9004
Epoch 202/400
6/6 [==============================] - 0s 6ms/step - loss: 0.2113 - accuracy: 0.9043
Epoch 203/400
6/6 [==============================] - 0s 9ms/step - loss: 0.1687 - accuracy: 0.9238
Epoch 204/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1516 - accuracy: 0.9395
Epoch 205/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1642 - accuracy: 0.9355
Epoch 206/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1496 - accuracy: 0.9453
Epoch 207/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1496 - accuracy: 0.9336
Epoch 208/400
6/6 [==============================] - 0s 9ms/step - loss: 0.1515 - accuracy: 0.9453
Epoch 209/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1639 - accuracy: 0.9414
Epoch 210/400
6/6 [==============================] - 0s 4ms/step - loss: 0.1620 - accuracy: 0.9258
Epoch 211/400
6/6 [==============================] - 0s 4ms/step - loss: 0.1401 - accuracy: 0.9492
Epoch 212/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1512 - accuracy: 0.9180
Epoch 213/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1410 - accuracy: 0.9355
Epoch 214/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1537 - accuracy: 0.9531
Epoch 215/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1386 - accuracy: 0.9414
Epoch 216/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1523 - accuracy: 0.9395
Epoch 217/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1484 - accuracy: 0.9395
Epoch 218/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1550 - accuracy: 0.9258
Epoch 219/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1514 - accuracy: 0.9355
Epoch 220/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1268 - accuracy: 0.9414
Epoch 221/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1349 - accuracy: 0.9512
Epoch 222/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1363 - accuracy: 0.9473
Epoch 223/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1416 - accuracy: 0.9375
Epoch 224/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1385 - accuracy: 0.9473
Epoch 225/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1392 - accuracy: 0.9355
Epoch 226/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1273 - accuracy: 0.9453
Epoch 227/400
6/6 [==============================] - 0s 17ms/step - loss: 0.1302 - accuracy: 0.9492
Epoch 228/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1225 - accuracy: 0.9453
Epoch 229/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1177 - accuracy: 0.9473
Epoch 230/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1327 - accuracy: 0.9473
Epoch 231/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1364 - accuracy: 0.9434
Epoch 232/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1313 - accuracy: 0.9453
Epoch 233/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1466 - accuracy: 0.9414
Epoch 234/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1641 - accuracy: 0.9473
Epoch 235/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1288 - accuracy: 0.9492
Epoch 236/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1463 - accuracy: 0.9297
Epoch 237/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1344 - accuracy: 0.9492
Epoch 238/400
6/6 [==============================] - 0s 26ms/step - loss: 0.1835 - accuracy: 0.9180
Epoch 239/400
6/6 [==============================] - 0s 26ms/step - loss: 0.1715 - accuracy: 0.9258
Epoch 240/400
6/6 [==============================] - 0s 13ms/step - loss: 0.1342 - accuracy: 0.9434
Epoch 241/400
6/6 [==============================] - 0s 19ms/step - loss: 0.1363 - accuracy: 0.9434
Epoch 242/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1340 - accuracy: 0.9434
Epoch 243/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1765 - accuracy: 0.9121
Epoch 244/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1863 - accuracy: 0.9316
Epoch 245/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1818 - accuracy: 0.9238
Epoch 246/400
6/6 [==============================] - 0s 20ms/step - loss: 0.1545 - accuracy: 0.9336
Epoch 247/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1431 - accuracy: 0.9355
Epoch 248/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1168 - accuracy: 0.9531
Epoch 249/400
6/6 [==============================] - 0s 4ms/step - loss: 0.1290 - accuracy: 0.9492
Epoch 250/400
6/6 [==============================] - 0s 10ms/step - loss: 0.1529 - accuracy: 0.9375
Epoch 251/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1516 - accuracy: 0.9336
Epoch 252/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1465 - accuracy: 0.9434
Epoch 253/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1411 - accuracy: 0.9219
Epoch 254/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1503 - accuracy: 0.9395
Epoch 255/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1360 - accuracy: 0.9414
Epoch 256/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1277 - accuracy: 0.9473
Epoch 257/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1350 - accuracy: 0.9414
Epoch 258/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1324 - accuracy: 0.9395
Epoch 259/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1171 - accuracy: 0.9434
Epoch 260/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1336 - accuracy: 0.9512
Epoch 261/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1391 - accuracy: 0.9434
Epoch 262/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1280 - accuracy: 0.9512
Epoch 263/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1286 - accuracy: 0.9473
Epoch 264/400
6/6 [==============================] - 0s 33ms/step - loss: 0.1361 - accuracy: 0.9395
Epoch 265/400
6/6 [==============================] - 0s 19ms/step - loss: 0.1387 - accuracy: 0.9355
Epoch 266/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1136 - accuracy: 0.9551
Epoch 267/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1402 - accuracy: 0.9473
Epoch 268/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1606 - accuracy: 0.9355
Epoch 269/400
6/6 [==============================] - 0s 10ms/step - loss: 0.1622 - accuracy: 0.9336
Epoch 270/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1674 - accuracy: 0.9258
Epoch 271/400
6/6 [==============================] - 0s 14ms/step - loss: 0.1246 - accuracy: 0.9473
Epoch 272/400
6/6 [==============================] - 0s 11ms/step - loss: 0.1276 - accuracy: 0.9453
Epoch 273/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1668 - accuracy: 0.9316
Epoch 274/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1782 - accuracy: 0.9355
Epoch 275/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1671 - accuracy: 0.9297
Epoch 276/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1497 - accuracy: 0.9473
Epoch 277/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1261 - accuracy: 0.9453
Epoch 278/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1240 - accuracy: 0.9570
Epoch 279/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1632 - accuracy: 0.9238
Epoch 280/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1767 - accuracy: 0.9336
Epoch 281/400
6/6 [==============================] - 0s 9ms/step - loss: 0.1284 - accuracy: 0.9512
Epoch 282/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1311 - accuracy: 0.9453
Epoch 283/400
6/6 [==============================] - 0s 16ms/step - loss: 0.1390 - accuracy: 0.9453
Epoch 284/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1259 - accuracy: 0.9512
Epoch 285/400
6/6 [==============================] - 0s 11ms/step - loss: 0.1369 - accuracy: 0.9434
Epoch 286/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1514 - accuracy: 0.9453
Epoch 287/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1318 - accuracy: 0.9512
Epoch 288/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1623 - accuracy: 0.9473
Epoch 289/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1259 - accuracy: 0.9512
Epoch 290/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1321 - accuracy: 0.9434
Epoch 291/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1207 - accuracy: 0.9512
Epoch 292/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1231 - accuracy: 0.9473
Epoch 293/400
6/6 [==============================] - 0s 15ms/step - loss: 0.1259 - accuracy: 0.9395
Epoch 294/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1216 - accuracy: 0.9531
Epoch 295/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1232 - accuracy: 0.9492
Epoch 296/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1416 - accuracy: 0.9453
Epoch 297/400
6/6 [==============================] - 0s 4ms/step - loss: 0.1175 - accuracy: 0.9492
Epoch 298/400
6/6 [==============================] - 0s 5ms/step - loss: 0.2018 - accuracy: 0.9004
Epoch 299/400
6/6 [==============================] - 0s 16ms/step - loss: 0.1384 - accuracy: 0.9453
Epoch 300/400
6/6 [==============================] - 0s 25ms/step - loss: 0.1251 - accuracy: 0.9434
Epoch 301/400
6/6 [==============================] - 0s 13ms/step - loss: 0.1087 - accuracy: 0.9590
Epoch 302/400
6/6 [==============================] - 0s 12ms/step - loss: 0.1231 - accuracy: 0.9531
Epoch 303/400
6/6 [==============================] - 0s 9ms/step - loss: 0.1243 - accuracy: 0.9512
Epoch 304/400
6/6 [==============================] - 0s 15ms/step - loss: 0.1236 - accuracy: 0.9453
Epoch 305/400
6/6 [==============================] - 0s 19ms/step - loss: 0.1195 - accuracy: 0.9531
Epoch 306/400
6/6 [==============================] - 0s 14ms/step - loss: 0.1163 - accuracy: 0.9492
Epoch 307/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1254 - accuracy: 0.9492
Epoch 308/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1316 - accuracy: 0.9453
Epoch 309/400
6/6 [==============================] - 0s 9ms/step - loss: 0.1292 - accuracy: 0.9492
Epoch 310/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1310 - accuracy: 0.9492
Epoch 311/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1753 - accuracy: 0.9238
Epoch 312/400
6/6 [==============================] - 0s 6ms/step - loss: 0.2028 - accuracy: 0.9160
Epoch 313/400
6/6 [==============================] - 0s 11ms/step - loss: 0.1548 - accuracy: 0.9551
Epoch 314/400
6/6 [==============================] - 0s 4ms/step - loss: 0.1372 - accuracy: 0.9434
Epoch 315/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1551 - accuracy: 0.9395
Epoch 316/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1213 - accuracy: 0.9453
Epoch 317/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1510 - accuracy: 0.9297
Epoch 318/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1184 - accuracy: 0.9551
Epoch 319/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1379 - accuracy: 0.9336
Epoch 320/400
6/6 [==============================] - 0s 18ms/step - loss: 0.1170 - accuracy: 0.9512
Epoch 321/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1228 - accuracy: 0.9551
Epoch 322/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1153 - accuracy: 0.9531
Epoch 323/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1194 - accuracy: 0.9531
Epoch 324/400
6/6 [==============================] - 0s 10ms/step - loss: 0.1080 - accuracy: 0.9531
Epoch 325/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1165 - accuracy: 0.9512
Epoch 326/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1061 - accuracy: 0.9609
Epoch 327/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1083 - accuracy: 0.9492
Epoch 328/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1109 - accuracy: 0.9531
Epoch 329/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1222 - accuracy: 0.9512
Epoch 330/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1102 - accuracy: 0.9512
Epoch 331/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1040 - accuracy: 0.9512
Epoch 332/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1465 - accuracy: 0.9492
Epoch 333/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1044 - accuracy: 0.9512
Epoch 334/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1163 - accuracy: 0.9453
Epoch 335/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1064 - accuracy: 0.9609
Epoch 336/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1128 - accuracy: 0.9492
Epoch 337/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1348 - accuracy: 0.9453
Epoch 338/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1596 - accuracy: 0.9336
Epoch 339/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1109 - accuracy: 0.9512
Epoch 340/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1071 - accuracy: 0.9570
Epoch 341/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1111 - accuracy: 0.9531
Epoch 342/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1044 - accuracy: 0.9629
Epoch 343/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1598 - accuracy: 0.9297
Epoch 344/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1223 - accuracy: 0.9551
Epoch 345/400
6/6 [==============================] - 0s 33ms/step - loss: 0.1076 - accuracy: 0.9531
Epoch 346/400
6/6 [==============================] - 0s 13ms/step - loss: 0.1086 - accuracy: 0.9473
Epoch 347/400
6/6 [==============================] - 0s 34ms/step - loss: 0.0990 - accuracy: 0.9512
Epoch 348/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1296 - accuracy: 0.9531
Epoch 349/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1188 - accuracy: 0.9492
Epoch 350/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1555 - accuracy: 0.9316
Epoch 351/400
6/6 [==============================] - 0s 16ms/step - loss: 0.1444 - accuracy: 0.9453
Epoch 352/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1172 - accuracy: 0.9609
Epoch 353/400
6/6 [==============================] - 0s 13ms/step - loss: 0.1332 - accuracy: 0.9414
Epoch 354/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1202 - accuracy: 0.9453
Epoch 355/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1162 - accuracy: 0.9434
Epoch 356/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1364 - accuracy: 0.9492
Epoch 357/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1224 - accuracy: 0.9570
Epoch 358/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1161 - accuracy: 0.9512
Epoch 359/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1105 - accuracy: 0.9551
Epoch 360/400
6/6 [==============================] - 0s 6ms/step - loss: 0.0989 - accuracy: 0.9551
Epoch 361/400
6/6 [==============================] - 0s 8ms/step - loss: 0.0973 - accuracy: 0.9551
Epoch 362/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1177 - accuracy: 0.9531
Epoch 363/400
6/6 [==============================] - 0s 4ms/step - loss: 0.1118 - accuracy: 0.9570
Epoch 364/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1138 - accuracy: 0.9590
Epoch 365/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1300 - accuracy: 0.9414
Epoch 366/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1551 - accuracy: 0.9355
Epoch 367/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1344 - accuracy: 0.9453
Epoch 368/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1190 - accuracy: 0.9512
Epoch 369/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1215 - accuracy: 0.9453
Epoch 370/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1049 - accuracy: 0.9512
Epoch 371/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1142 - accuracy: 0.9551
Epoch 372/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1141 - accuracy: 0.9590
Epoch 373/400
6/6 [==============================] - 0s 8ms/step - loss: 0.1166 - accuracy: 0.9453
Epoch 374/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1131 - accuracy: 0.9492
Epoch 375/400
6/6 [==============================] - 0s 19ms/step - loss: 0.1102 - accuracy: 0.9551
Epoch 376/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1099 - accuracy: 0.9590
Epoch 377/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1218 - accuracy: 0.9492
Epoch 378/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1358 - accuracy: 0.9395
Epoch 379/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1222 - accuracy: 0.9512
Epoch 380/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1159 - accuracy: 0.9492
Epoch 381/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1227 - accuracy: 0.9492
Epoch 382/400
6/6 [==============================] - 0s 19ms/step - loss: 0.1112 - accuracy: 0.9453
Epoch 383/400
6/6 [==============================] - 0s 32ms/step - loss: 0.1159 - accuracy: 0.9512
Epoch 384/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1125 - accuracy: 0.9473
Epoch 385/400
6/6 [==============================] - 0s 10ms/step - loss: 0.1206 - accuracy: 0.9492
Epoch 386/400
6/6 [==============================] - 0s 10ms/step - loss: 0.1223 - accuracy: 0.9512
Epoch 387/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1200 - accuracy: 0.9512
Epoch 388/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1011 - accuracy: 0.9629
Epoch 389/400
6/6 [==============================] - 0s 7ms/step - loss: 0.0949 - accuracy: 0.9531
Epoch 390/400
6/6 [==============================] - 0s 6ms/step - loss: 0.0934 - accuracy: 0.9570
Epoch 391/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1146 - accuracy: 0.9668
Epoch 392/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1126 - accuracy: 0.9551
Epoch 393/400
6/6 [==============================] - 0s 4ms/step - loss: 0.1005 - accuracy: 0.9531
Epoch 394/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1107 - accuracy: 0.9512
Epoch 395/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1154 - accuracy: 0.9492
Epoch 396/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1113 - accuracy: 0.9531
Epoch 397/400
6/6 [==============================] - 0s 5ms/step - loss: 0.1192 - accuracy: 0.9492
Epoch 398/400
6/6 [==============================] - 0s 9ms/step - loss: 0.1087 - accuracy: 0.9551
Epoch 399/400
6/6 [==============================] - 0s 7ms/step - loss: 0.1010 - accuracy: 0.9590
Epoch 400/400
6/6 [==============================] - 0s 6ms/step - loss: 0.1066 - accuracy: 0.9590
In [ ]:
print("Execution time: ",(end_n-start_n), "s")
Execution time:  28.512630701065063 s
In [ ]:
# Obtaining test set accuracy score
cm = 0
y_pred = model_deep.predict(X_test)
y_pred = (y_pred > 0.50)
cm = confusion_matrix(y_test, y_pred)
print("Accuracy: {}%".format(((cm[0][0] + cm[1][1])/len(y_test))*100))
2/2 [==============================] - 0s 4ms/step
Accuracy: 96.49122807017544%
In [ ]:
# Plotting confidence matrix
cat = ['Benign - 0', 'Malignant - 1']
sns.heatmap(cm, annot = True, xticklabels= cat, yticklabels = cat, cmap = 'Blues')
Out[ ]:
<AxesSubplot: >

Conclusions¶

As we see both methods can yield similar results. In the particular case ANN architecture gave 1 missclassification case more than Supporter Vector Machine model. Execution time of coarse search through multiple models plus fine grid-search of the best model took 137 seconds. On the same machine ANN fitting took 29 seconds. However preparing and testing multiple architectures of neural network to find one working properly on this particular dataset took significant amount of time, while searching and fitting through standard models was just running simple search functions. It is necessary to create similar methods for looping through multiple neural network architecture to compare both methods in terms of exectution time. It might be more beneficial to use simpler models first on small datasets like this as neural networks tend to work better with large training input sizes in general.